/**
 * @file main.cpp
 * @author bean (813023818@qq.com)
 * @brief 
 * @version 0.1
 * @date 2023-01-05
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#include "systemc.h"
#include "UART.h"
#include "monitor.h"

int sc_main(int argc, char **argv)
{

    sc_signal<sc_bv<1>> t_uart_txd;
    sc_signal<sc_bv<8>> t_q, t_q_output;
    sc_signal<bool> t_sys_rst_n, t_start_flag, t_tx_flag;
    sc_clock clock("clock", 20, SC_NS);
    cout << "straT: " << endl;

    // 实例化端口，绑定
    UART0 uart_send("UART_TEST");
    uart_send.clk(clock);
    uart_send.start_flag(t_start_flag);
    uart_send.tx_flag(t_tx_flag);
    uart_send.sys_rst_n(t_sys_rst_n);
    uart_send.q(t_q);
    uart_send.q_output(t_q_output);
    uart_send.uart_txd(t_uart_txd);

    // 实例化端口，绑定
    monitor_s mol("mol_TEST");
    mol.clk(clock);
    mol.m_start_flag(t_start_flag);
    mol.m_tx_flag(t_tx_flag);
    mol.m_sys_rst_n(t_sys_rst_n);
    mol.m_q(t_q);
    mol.m_q_output(t_q_output);
    mol.m_uart_txd(t_uart_txd);

    // 用于生成波形文件
    sc_trace_file *tf = sc_create_vcd_trace_file("Top");
    sc_trace(tf, uart_send.clk, "clk");
    sc_trace(tf, uart_send.start_flag, "start_flag");
    sc_trace(tf, uart_send.tx_flag, "tx_flag");
    sc_trace(tf, uart_send.sys_rst_n, "sys_rst_n");
    sc_trace(tf, uart_send.q, "q");
    sc_trace(tf, uart_send.q_output, "q_output");
    sc_trace(tf, uart_send.uart_txd, "uart_txd");

    //  给case进行验证
    // t_sys_rst_n.write(false);
    t_sys_rst_n.write(true);
    t_sys_rst_n.write(false);
    sc_start(100, SC_NS);
    t_sys_rst_n.write(true);
    t_start_flag.write(true);
    t_q.write("10111011");
    sc_start(1500, SC_US);    // 设置仿真时间
    t_q.write("00110011");
    sc_start(1500, SC_US);    // 设置仿真时间

    sc_close_vcd_trace_file(tf); /// 关闭仿真文件
    sc_stop();                   // 仿真停止
    return 0;
}
